iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
Kubernetes

K8s 資料庫管理系統系列 第 9

Day 9 K8s公車資料庫管理系統

  • 分享至 

  • xImage
  •  

今天是第九天我們可以寫一個公車的K8s資料庫管理系統,以下是我的程式碼

1. 系統設計:

  • 車輛管理服務 (Vehicle Management Service):管理車輛的詳細信息,如車輛ID、車輛類型、維修狀態等。
  • 路線管理服務 (Route Management Service):管理公車的路線,如起點、終點、途經站點等。
  • 乘客管理服務 (Passenger Management Service):管理乘客信息,如票價、訂單、乘車歷史等。
  • 公車定位服務 (Bus Location Service):實時追蹤公車的位置。
  • 公車排程服務 (Bus Scheduling Service):排定公車運行時間與班次。

每個服務都可以作為獨立的微服務部署在 Kubernetes 集群中。

2. Kubernetes 佈署架構:

  1. Docker Image: 為每個微服務創建 Docker 映像。
  2. Kubernetes Deployment: 創建 Kubernetes 部署來啟動並管理這些微服務。
  3. Kubernetes Service: 創建 Kubernetes 服務來暴露每個微服務,讓它們之間可以通信。
  4. ConfigMaps & Secrets: 使用 ConfigMaps 保存配置,使用 Secrets 保存敏感信息。

3. 基本的微服務代碼範例 (Node.js + Express):

車輛管理服務範例:

// vehicle-service.js
const express = require('express');
const app = express();
app.use(express.json());

let vehicles = [
    { id: 1, type: 'bus', status: 'active' },
    { id: 2, type: 'mini-bus', status: 'maintenance' }
];

// 獲取所有車輛信息
app.get('/vehicles', (req, res) => {
    res.json(vehicles);
});

// 新增車輛
app.post('/vehicles', (req, res) => {
    const vehicle = req.body;
    vehicles.push(vehicle);
    res.status(201).json(vehicle);
});

// 更新車輛狀態
app.put('/vehicles/:id', (req, res) => {
    const { id } = req.params;
    const { status } = req.body;
    const vehicle = vehicles.find(v => v.id == id);
    if (vehicle) {
        vehicle.status = status;
        res.json(vehicle);
    } else {
        res.status(404).send('Vehicle not found');
    }
});

app.listen(3000, () => {
    console.log('Vehicle management service running on port 3000');
});

Dockerfile:

dockerfile
# 使用 Node.js 基礎映像
FROM node:14

# 設定工作目錄
WORKDIR /app

# 複製 package.json 並安裝依賴
COPY package*.json ./
RUN npm install

# 複製其餘的應用程式代碼
COPY . .

# 暴露應用程式的埠
EXPOSE 3000

# 啟動應用程式
CMD ["node", "vehicle-service.js"]

4. 創建 Kubernetes 部署檔案:

Deployment 檔案 (vehicle-deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vehicle-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: vehicle-service
  template:
    metadata:
      labels:
        app: vehicle-service
    spec:
      containers:
      - name: vehicle-service
        image: <your-docker-image>:latest
        ports:
        - containerPort: 3000

Service 檔案 (vehicle-service.yaml):

apiVersion: v1
kind: Service
metadata:
  name: vehicle-service
spec:
  selector:
    app: vehicle-service
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: ClusterIP

5. 部署至 Kubernetes:

確保你已經安裝好 Kubernetes 集群並且 Kubectl 可以正常使用。

# 部署車輛管理服務
kubectl apply -f vehicle-deployment.yaml

# 創建服務暴露
kubectl apply -f vehicle-service.yaml

6. 重複上述步驟:

為其他服務(如路線管理、乘客管理等)創建類似的微服務和 Kubernetes 配置。

7. 配置 Service Mesh (可選):

你可以使用 Service Mesh(例如 Istio)來監控、管理和安全地路由服務之間的流量。

8. 使用 ConfigMaps 和 Secrets:

你可以使用 ConfigMaps 保存配置信息,例如服務的環境變數:

apiVersion: v1
kind: ConfigMap
metadata:
  name: bus-management-config
data:
  vehicle-service-url: "http://vehicle-service:3000"

Secrets 用於保存敏感數據,如 API 密鑰。

1. **車輛管理微服務

vehicle-service.js 檔案

const express = require('express');
const app = express();
app.use(express.json());
  • express 是一個 Node.js 的 web 應用框架。使用它可以快速建立一個 HTTP 服務。
  • app.use(express.json()) 用來解析傳入的 JSON 請求,這讓我們可以從請求體中提取資料。

車輛資料 (Vehicles)

let vehicles = [
    { id: 1, type: 'bus', status: 'active' },
    { id: 2, type: 'mini-bus', status: 'maintenance' }
];
  • 這裡使用了一個簡單的陣列 vehicles 來模擬資料庫,儲存所有的車輛資料。每輛車有一個 idtype(車型)和 status(狀態)。

獲取車輛列表

app.get('/vehicles', (req, res) => {
    res.json(vehicles);
});
  • app.get 定義了當用戶發送 GET /vehicles 請求時的行為,它會回傳所有車輛的 JSON 資料。

新增車輛

app.post('/vehicles', (req, res) => {
    const vehicle = req.body;
    vehicles.push(vehicle);
    res.status(201).json(vehicle);
});
  • app.post 定義了當用戶發送 POST /vehicles 請求時的行為,會從請求體中取得車輛資料 (req.body),並將該車輛新增到 vehicles 陣列中,然後回傳新增的車輛資料並設定 HTTP 狀態碼為 201(Created)。

更新車輛狀態

app.put('/vehicles/:id', (req, res) => {
    const { id } = req.params;
    const { status } = req.body;
    const vehicle = vehicles.find(v => v.id == id);
    if (vehicle) {
        vehicle.status = status;
        res.json(vehicle);
    } else {
        res.status(404).send('Vehicle not found');
    }
});
  • app.put 定義了當用戶發送 PUT /vehicles/:id 請求時的行為。這裡使用了 URL 參數 (:id) 來取得特定車輛的 ID,並從請求體中取得新的狀態 (status)。
  • 它會先查找該 id 對應的車輛,如果找到就更新狀態並回傳更新後的車輛資料。如果找不到該車輛,則回傳 404 (Not Found)。

啟動服務

app.listen(3000, () => {
    console.log('Vehicle management service running on port 3000');
});
  • 這行程式碼啟動了服務並監聽 3000 埠,當服務啟動時會在控制台輸出 "Vehicle management service running on port 3000"。

2. Dockerfile

Dockerfile 定義了如何將 Node.js 應用程式容器化。

dockerfile
# 使用 Node.js 基礎映像
FROM node:14
  • 使用 Node.js 版本 14 作為基礎映像,它提供了運行 Node.js 應用的環境。
dockerfile
# 設定工作目錄
WORKDIR /app
  • WORKDIR 指定了容器內的工作目錄,這裡設置為 /app。後續的指令都會在這個目錄下執行。
dockerfile
# 複製 package.json 並安裝依賴
COPY package*.json ./
RUN npm install
  • COPY package*.json ./ 會將本地的 package.json 檔案複製到容器中的 /app 目錄。
  • RUN npm install 執行安裝所有定義在 package.json 中的 Node.js 依賴。
dockerfile
# 複製其餘的應用程式代碼
COPY . .
  • 將本地的所有程式碼(同一目錄下的檔案)複製到容器內的 /app 目錄中。
dockerfile
# 暴露應用程式的埠
EXPOSE 3000
  • 暴露 3000 埠,這是我們應用程式在容器內監聽的埠。
dockerfile
# 啟動應用程式
CMD ["node", "vehicle-service.js"]
  • 使用 CMD 命令來啟動 Node.js 應用,這裡執行的是 vehicle-service.js 檔案。

3. Kubernetes 部署檔案

這些檔案定義了如何將微服務部署到 Kubernetes。

Deployment 檔案 (vehicle-deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vehicle-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: vehicle-service
  template:
    metadata:
      labels:
        app: vehicle-service
    spec:
      containers:
      - name: vehicle-service
        image: <your-docker-image>:latest
        ports:
        - containerPort: 3000
  • apiVersion: apps/v1 定義了 API 版本,我們使用 apps/v1 來創建 Deployment 資源。
  • kind: Deployment 指定我們要創建的是一個 Kubernetes 部署。
  • metadata 中的 name 定義了部署的名稱,這裡是 vehicle-service
  • spec.replicas 設定了運行該服務的副本數量(這裡是 3 個副本,確保服務的可用性和擴展性)。
  • template 定義了應用程式的 Pod 模板,指定了應用的容器、映像(image)和監聽的埠(3000 埠)。

Service 檔案 (vehicle-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: vehicle-service
spec:
  selector:
    app: vehicle-service
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: ClusterIP
  • kind: Service 創建一個 Kubernetes 服務,用來暴露我們的應用。
  • metadata.name 指定服務的名稱為 vehicle-service
  • selector 用來選擇與該服務對應的 Pod(即所有標籤為 app: vehicle-service 的 Pod)。
  • ports 定義了從外部到內部的端口映射,外部使用 80 埠訪問,並將流量轉發到容器內部的 3000 埠。
  • type: ClusterIP 指定服務的類型為內部的集群 IP,這樣只有集群內的其他應用可以訪問這個服務。

4. 部署到 Kubernetes

最後,我可以使用 kubectl 指令將這些資源部署到 Kubernetes 集群。

# 部署車輛管理服務
kubectl apply -f vehicle-deployment.yaml

# 創建服務暴露
kubectl apply -f vehicle-service.yaml

這些命令會創建並部署你的車輛管理微服務到 Kubernetes 集群。

總結:

  • 這個系統使用了 Node.js 和 Express 來構建公車管理微服務,並將其容器化,最後部署到 Kubernetes 集群中。
  • 透過 Kubernetes Deployment 和 Service,你可以擴展應用程式並暴露服務,確保在多副本運行的情況下依然能夠穩定運作。
  • 每個部分的程式碼設計都遵循了微服務的最佳實踐,可以輕鬆地擴展和管理。

上一篇
day 8 k8s圖書館資料庫管理系統
下一篇
day 10 k8s 戶口資料資料庫管理系統
系列文
K8s 資料庫管理系統15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言